//
//  SyncVC.m
//  iTeVe
//
//  Created by Pedro Gonzalez on 03/05/14.
//  Copyright (c) 2014 SISI Software. All rights reserved.
//

#import "SyncVC.h"

@interface SyncVC ()

@end

@implementation SyncVC

@synthesize contatti, articoli, tipilistini, listini, aliquote, depositi, pagamenti, agenti, trasporti, banche, tipimov;
@synthesize responseData;
@synthesize activityIndicator, testoMessaggi, btnSyncronizza, swiAggiornamentiOTutti;
@synthesize lblUtente, lblPassword, tfUtente, tfPassword;

int status = 0;
NSString* messaggio = @"";
NSString* lastsync = @"";
NSString* utente = @"";
NSString* password = @"";

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    messaggio = @"";
    
    utente = [[NSUserDefaults standardUserDefaults] objectForKey:@"utente"];
    password = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];
    
    if (utente == nil){
        utente = @"jogdemo.admin";
    }
    if (password==nil){
        password = @"admin";
    }
    
    tfUtente.text = utente;
    tfPassword.text = password;
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    [formatter setLocale:[NSLocale currentLocale]];
    NSString* ultSync = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastsync"];
    if (ultSync.length>0){
        NSDate* data = [formatter dateFromString:ultSync];
        [formatter setDateFormat:@"dd-MM-YYYY HH:mm:ss"];
        NSString* tipoAggionamento = [NSString stringWithFormat:@"Ultimo aggiornamento:  %@ \r\n", [formatter stringFromDate:data]];
        messaggio = [messaggio stringByAppendingString:tipoAggionamento];
    }
    testoMessaggi.text = messaggio;

}

- (void)syncAll:(int )st
{
    
    if (!swiAggiornamentiOTutti.isOn){
        lastsync = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastsync"];
    } else {
            lastsync = @"";
    }
    
    utente = [utente stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    password = [password stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    
    NSString *key = @"3vYr823Thfh92ei2pq5kf9sl41ksi3m2";
    
    NSData *plain = [utente dataUsingEncoding:NSUTF8StringEncoding];
    NSData *cipher = [plain AES256EncryptWithKey:key];
    [Base64 initialize];
	NSString *encryptedUtente = [Base64 encode:cipher];
    
    plain = [password dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
	NSString *encryptedPassword = [Base64 encode:cipher];
    
    //NSURL *URL = [NSURL URLWithString:@"https://sisisoftware.it/jog/public/services.zul"];
    NSURL *URL = [NSURL URLWithString:@"http://192.168.1.65:8080/carrito-de-venta/public/services.zul"];
    
   
    if (st==1){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Clienti :" :@"TVCLIENTI"];
    } else if (st==2){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Articoli :" :@"TVARTICOLI"];
    } else if (st==3){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Tipi Listini :" :@"TVTIPILISTINI"];
    } else if (st==4){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Listini di Vendita :" :@"TVLISTINI"];
    } else if (st==5){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Aliquote :" :@"TVALIQUOTE"];
    } else if (st==6){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Depositi :" :@"TVDEPOSITI"];
    } else if (st==7){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Condizioni di Pagamento :" :@"TVCONDPAGAMENTO"];
    } else if (st==8){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Agenti :" :@"TVAGENTI"];
    } else if (st==9){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Condizioni di Trasporto :" :@"TVTRASPORTI"];
    } else if (st==10){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Banche :" :@"TVBANCHE"];
    } else if (st==11){
        [self syncVarie:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nImportazione Tipi di Movimento :" :@"TVTIPIMOV"];
    } else if (st>11){
        
        NSMutableArray *clienti = [[NSMutableArray alloc] init];
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
        [formatter setLocale:[NSLocale currentLocale]];
        //NSString* ultSync = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastsync"];
        //NSDate* data = [formatter dateFromString:ultSync];
        //clienti = [db getClienti:nil :data];
        clienti = [db getClienti:nil :nil];
        
        /*
        NSError *writeError = nil;
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:clienti options:NSJSONWritingPrettyPrinted error:&writeError];
        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        NSLog(@"JSON Output: %@", jsonString);
         */

//        NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:[clienti count]];
        NSMutableArray *clientidainviare = [[NSMutableArray alloc] initWithCapacity:[clienti count]];
        
        NSError *error = nil;
        
        for (int i=0; i<[clienti count]; i++) {
                Cliente *cliente = [clienti objectAtIndex:i];
            
                NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:
                                  cliente.codice, @"codice", cliente.ragionesociale, @"ragionesociale", nil];
            
            [clientidainviare setObject:info atIndexedSubscript:i];

        }
        
        NSDictionary *tuttiIClienti = [NSDictionary dictionaryWithObjectsAndKeys:
                                          clientidainviare, @"Clienti", nil];
        
        NSData* jsonData = [NSJSONSerialization dataWithJSONObject:tuttiIClienti
                                                           options:NSJSONWritingPrettyPrinted error:&error];
        NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
//        NSLog(@"JSON Output: %@", jsonString);

        
        [self syncVarieInvio:key :plain :cipher :URL :encryptedUtente :encryptedPassword :@"\r\nEsportazione Clienti:" :@"TVCLIENTIINVIO" :jsonString];


        
    }
    
    status++;
}


- (void)syncVarie:(NSString *)key :(NSData *)plain :(NSData *)cipher :(NSURL *)URL :(NSString *)encryptedUtente :(NSString *)encryptedPassword :(NSString *)msg :(NSString *)op
{
    
    messaggio = [messaggio stringByAppendingString:msg];
    testoMessaggi.text = messaggio;
    
    NSString *operazione = op;
    NSString *filtro = @"NULL";
    NSString *filtroUnico = @"NULL";
    
    if (lastsync.length>0){
        filtro = lastsync;
    }
    
    
    operazione = [operazione stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    filtro = [filtro stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    filtroUnico = [filtroUnico stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    
    plain = [operazione dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
	NSString *encryptedOperazione = [Base64 encode:cipher];
    
    plain = [filtro dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
	NSString *encryptedFiltro = [Base64 encode:cipher];
    
    
    plain = [filtroUnico dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
	NSString *encryptedFiltroUnico = [Base64 encode:cipher];
    
    NSString *params = [NSString stringWithFormat:@"paramuno=%@&paramdue=%@&paramtre=%@&paramquattro=%@&paramcinque=%@", encryptedUtente, encryptedPassword, encryptedOperazione, encryptedFiltro, encryptedFiltroUnico];
    NSData *data = [params dataUsingEncoding:NSUTF8StringEncoding];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    [request setHTTPMethod:@"POST"];
    
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:data];
    
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    
}


- (void)syncVarieInvio:(NSString *)key :(NSData *)plain :(NSData *)cipher :(NSURL *)URL :(NSString *)encryptedUtente :(NSString *)encryptedPassword :(NSString *)msg :(NSString *)op :(NSString *)json
{
    
    messaggio = [messaggio stringByAppendingString:msg];
    testoMessaggi.text = messaggio;
    
    NSString *operazione = op;
    NSString *filtro = @"NULL";
    NSString *filtroUnico = @"NULL";
    
    if (lastsync.length>0){
        filtro = lastsync;
    }
    
    
    operazione = [operazione stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    filtro = [filtro stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    filtroUnico = [filtroUnico stringByPaddingTheLeftToLength:16 withString:@" " startingAtIndex:0];
    
    plain = [operazione dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
    NSString *encryptedOperazione = [Base64 encode:cipher];
    
    plain = [filtro dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
    NSString *encryptedFiltro = [Base64 encode:cipher];
    
    
    plain = [filtroUnico dataUsingEncoding:NSUTF8StringEncoding];
    cipher = [plain AES256EncryptWithKey:key];
    NSString *encryptedFiltroUnico = [Base64 encode:cipher];

    
    NSString *params = [NSString stringWithFormat:@"paramuno=%@&paramdue=%@&paramtre=%@&paramquattro=%@&paramcinque=%@&paramsette=%@", encryptedUtente, encryptedPassword, encryptedOperazione, encryptedFiltro, encryptedFiltroUnico, json];
    NSData *data = [params dataUsingEncoding:NSUTF8StringEncoding];
    
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];
    [request setHTTPMethod:@"POST"];
    
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:data];
    
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    //NSLog(@"%@", [NSDate date]);
    responseData = [[NSMutableData alloc] init];
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [responseData appendData:data];
}

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"Errore ricezione dati...");
    messaggio = [messaggio stringByAppendingString:@"Errore ricezione dati...\r\n"];
    testoMessaggi.text = messaggio;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    NSArray *trustedHosts = [NSArray arrayWithObjects:@"mytrustedhost",nil];
    
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        if ([trustedHosts containsObject:challenge.protectionSpace.host]) {
            [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
        }
    }
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}


-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
    NSLog(@"Ricevuti %lu bytes...",(unsigned long)[responseData length]);
    
    
    messaggio = [NSString stringWithFormat:@"%@Ricevuti %lu bytes... - ", messaggio, (unsigned long)[responseData length]];
    testoMessaggi.text = messaggio;
    
    NSError* errore;

    // clienti
    if (status==1){
        [self sincronizzoClienti:errore];
        
        [self syncAll:2]; // chiamata per la sincronizzazione articoli
        
    // articoli
    } else if (status==2) {
        
        [self sincronizzoArticoli:errore];
        
        [self syncAll:3]; // chiamata per la sincronizzazione tipi listini

    // tipi listini
    } else if (status==3) {
        
        [self sincronizzoTipilistini:errore];
        
        [self syncAll:4]; // chiamata per la sincronizzazione listini articoli
        
    // listini articolo
    } else if (status==4) {
        
        [self sincronizzoListiniArticoli:errore];
        
        [self syncAll:5]; // chiamata per la sincronizzazione delle aliquote
        
    // aliquote iva
    } else if (status==5) {
        
        [self sincronizzoAliquota:errore];
        
        [self syncAll:6];
        
    } else if (status==6) {
        
        [self sincronizzoDepositi:errore];
        
        [self syncAll:7];
        
    } else if (status==7) {
        
        [self sincronizzoPagamento:errore];
        
        [self syncAll:8];
        
    } else if (status==8) {
        
        [self sincronizzoAgenti:errore];
        
        [self syncAll:9];

        
    } else if (status==9) {
        
        [self sincronizzoTrasporti:errore];
        
        [self syncAll:10];

    } else if (status==10) {
        
        [self sincronizzoBanche:errore];
        [self syncAll:11];
        
    } else if (status==11) {
        
        [self sincronizzoTipiMov:errore];
        
        [self syncAll:12]; // invio dati (clienti)
        
    }
    
    //NSLog(@"%@", [NSDate date]);
}


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}



- (void) sincronizzoClienti:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"nominativi"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;

    int nuovi = 0, modificati = 0;
    
    NSMutableArray *contattiTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Cliente *c = [[Cliente alloc] init];
        c.codice          = [dict objectForKey:@"Codice"];
        c.ragionesociale  = [dict objectForKey:@"Nome"];
        c.indirizzo = [dict objectForKey:@"Indirizzo"];
        c.cap = [dict objectForKey:@"Cap"];
        c.citta = [dict objectForKey:@"Citta"];
        c.provincia = [dict objectForKey:@"Provincia"];
        c.nazione = [dict objectForKey:@"Nazione"];
        c.telefono = [dict objectForKey:@"Telefono"];
        c.fax = [dict objectForKey:@"Fax"];
        c.cellulare = [dict objectForKey:@"Cellulare"];
        c.email = [dict objectForKey:@"Email"];
        c.sitoweb = [dict objectForKey:@"SitoWeb"];
        c.partitaiva = [dict objectForKey:@"PartitaIva"];
        c.codicefiscale = [dict objectForKey:@"Cap"];
        c.sc1 = [dict objectForKey:@"SC1"];
        c.sc2 = [dict objectForKey:@"SC2"];
        c.sc3 = [dict objectForKey:@"SC3"];
        c.sc4 = [dict objectForKey:@"SC4"];
        c.nota = [dict objectForKey:@"Nota"];
        c.codlistino = [dict objectForKey:@"CodListino"];
        c.codagente = [dict objectForKey:@"CodAgente"];
        c.codtrasporto = [dict objectForKey:@"CodTrasporto"];
        c.codpagamento = [dict objectForKey:@"CodPagamento"];
        c.codbanca = [dict objectForKey:@"CodBanca"];
        c.codesenzione = [dict objectForKey:@"CodEsenzione"];
        [contattiTMP addObject:c];
    }
    
    self.contatti = [contattiTMP copy];
   
    
    for (int i=0; i<contatti.count; i++) {
        Cliente *cliente = [[Cliente alloc] init];
        Cliente *clientedb = [[Cliente alloc] init];
        cliente = contatti[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        
        clientedb = [db getClienteXCampox:@"partitaiva" :cliente.partitaiva];
        if (clientedb.idcliente==0){
            clientedb = [db getClienteXCampox:@"ragionesociale" :cliente.ragionesociale];
        }
        
        if (clientedb.idcliente==0){
          [db insertCliente:cliente];
            nuovi++;
        } else {
            cliente.idcliente = clientedb.idcliente;
            [db updateCliente:cliente];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync clienti...");
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo clienti: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
}


- (void) sincronizzoClientiAlGestionale:(NSError *)errore
{

    FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
    
    
    
}


- (void) sincronizzoArticoli:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"articoli"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *articoliTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Articolo *c = [[Articolo alloc] init];
        c.codart = [dict objectForKey:@"Codice"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.codali = [dict objectForKey:@"Codali"];
        c.costo = [dict objectForKey:@"Costo"];
        c.unmisura = [dict objectForKey:@"Misura"];
        [articoliTMP addObject:c];
    }
    
    self.articoli = [articoliTMP copy];

    
    for (int i=0; i<articoli.count; i++) {
        Articolo *articolo = [[Articolo alloc] init];
        Articolo *articolodb = [[Articolo alloc] init];
        articolo = articoli[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        articolodb = [db getArticoloxCodice:articolo.codart];
        
        if (articolodb.id==0){
            [db insertArticolo:articolo];
            nuovi++;
        } else {
            articolo.id = articolodb.id;
            [db updateArticolo:articolo];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync articoli...");
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo articoli: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;

}


- (void) sincronizzoTipilistini:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"tipilistini"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *tipilistiniTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Listino *c = [[Listino alloc] init];
        c.codlis = [dict objectForKey:@"Codlis"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.ivato = (BOOL)[dict objectForKey:@"Ivato"];
        [tipilistiniTMP addObject:c];
    }
    
    self.tipilistini = [tipilistiniTMP copy];
    
    
    for (int i=0; i<tipilistini.count; i++) {
        Listino *listino = [[Listino alloc] init];
        Listino *listinodb = [[Listino alloc] init];
        listino = tipilistini[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        listinodb = [db getListinoxCodice:listino.codlis];
        
        if (listinodb.id==0){
            [db insertListino:listino];
            nuovi++;
        } else {
            listino.id = listinodb.id;
            [db updateListino:listino];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync tipi listini...");
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo tipi listini: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoListiniArticoli:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"listini"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *listiniTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        ListinoArticolo *c = [[ListinoArticolo alloc] init];
        c.codlis = [dict objectForKey:@"Codlis"];
        c.codart = [dict objectForKey:@"Codart"];
        c.prezzo = [dict objectForKey:@"Prezzo"];
        [listiniTMP addObject:c];
    }
    
    self.listini = [listiniTMP copy];
    
    
    for (int i=0; i<listini.count; i++) {
        ListinoArticolo *listino = [[ListinoArticolo alloc] init];
        ListinoArticolo *listinodb = [[ListinoArticolo alloc] init];
        listino = listini[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        listinodb = [db getListinoArticoloxCodice:listino.codlis codiceArticolo:listino.codart];
        
        if (listinodb.id==0){
            [db insertListinoArticolo:listino];
            nuovi++;
        } else {
            listino.id = listinodb.id;
            [db updateListinoArticolo:listino];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync listini articoli...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo listini di vendita: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;

    
}


- (void) sincronizzoAliquota:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"aliquote"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *aliquoteTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Aliquota *c = [[Aliquota alloc] init];
        c.codali = [dict objectForKey:@"Codali"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.percentuale = [dict objectForKey:@"Percentuale"];
        [aliquoteTMP addObject:c];
    }
    
    self.aliquote = [aliquoteTMP copy];
    
    
    for (int i=0; i<aliquote.count; i++) {
        Aliquota *aliquota = [[Aliquota alloc] init];
        Aliquota *aliquotadb = [[Aliquota alloc] init];
        aliquota = aliquote[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        aliquotadb = [db getAliquotaxCodice:aliquota.codali];
        
        if (aliquotadb.id==0){
            [db insertAliquota:aliquota];
            nuovi++;
        } else {
            aliquota.id = aliquotadb.id;
            [db updateAliquota:aliquota];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync aliquote iva...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo aliquote iva: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoDepositi:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"depositi"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *depositiTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Deposito *c = [[Deposito alloc] init];
        c.coddep = [dict objectForKey:@"Coddep"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        [depositiTMP addObject:c];
    }
    
    self.depositi = [depositiTMP copy];
    
    
    for (int i=0; i<depositi.count; i++) {
        Deposito *deposito = [[Deposito alloc] init];
        Deposito *depositodb = [[Deposito alloc] init];
        deposito = depositi[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        depositodb = [db getDepositoxCodice:deposito.coddep];
        
        if (depositodb.id==0){
            [db insertDeposito:deposito];
            nuovi++;
        } else {
            deposito.id = depositodb.id;
            [db updateDeposito:deposito];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync depositi...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo depositi: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
        
}


- (void) sincronizzoPagamento:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"condizionipagamento"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *pagamentiTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Pagamento *c = [[Pagamento alloc] init];
        c.codpag = [dict objectForKey:@"Codpag"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.avvenuto = (BOOL)[dict objectForKey:@"Avvenuto"];
        [pagamentiTMP addObject:c];
    }
    
    self.pagamenti = [pagamentiTMP copy];
    
    
    for (int i=0; i<pagamenti.count; i++) {
        Pagamento *pagamento = [[Pagamento alloc] init];
        Pagamento *pagamentodb = [[Pagamento alloc] init];
        pagamento = pagamenti[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        pagamentodb = [db getCondizionePagamentoxCodice:pagamento.codpag];
        
        if (pagamentodb.id==0){
            [db insertCondizionePagamento:pagamento];
            nuovi++;
        } else {
            pagamento.id = pagamentodb.id;
            [db updateCondizionePagamento:pagamento];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync pagamenti...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo condizioni di pagamento: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoAgenti:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"agenti"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *agentiTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Agente *c = [[Agente alloc] init];
        c.codage = [dict objectForKey:@"Codage"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.indirizzo = [dict objectForKey:@"Indirizzo"];
        c.cap = [dict objectForKey:@"Cap"];
        c.citta = [dict objectForKey:@"Citta"];
        c.provincia = [dict objectForKey:@"Provincia"];
        c.nazione = [dict objectForKey:@"Nazione"];
        c.telefono = [dict objectForKey:@"Telefono"];
        c.cellulare = [dict objectForKey:@"Cellulare"];
        c.partitaiva = [dict objectForKey:@"PartitaIva"];
        c.codicefiscale = [dict objectForKey:@"CodiceFiscale"];
        c.email = [dict objectForKey:@"Email"];
        c.utente = [dict objectForKey:@"Utente"];
        c.password = [dict objectForKey:@"Password"];
        c.sitoweb = [dict objectForKey:@"SitoWeb"];

        [agentiTMP addObject:c];
    }
    
    self.agenti = [agentiTMP copy];
    
    
    for (int i=0; i<agenti.count; i++) {
        Agente *agente = [[Agente alloc] init];
        Agente *agentedb = [[Agente alloc] init];
        agente = agenti[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        agentedb = [db getAgentexCodice:agente.codage];
        
        if (agentedb.id==0){
            [db insertAgente:agente];
            nuovi++;
        } else {
            agente.id = agentedb.id;
            [db updateAgente:agente];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync agenti...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo agenti: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoTrasporti:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"trasporti"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *trasportoTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Trasporto *c = [[Trasporto alloc] init];
        c.codtra = [dict objectForKey:@"Codtra"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.indirizzo = [dict objectForKey:@"Indirizzo"];
        c.cap = [dict objectForKey:@"Cap"];
        c.citta = [dict objectForKey:@"Citta"];
        c.provincia = [dict objectForKey:@"Provincia"];
        c.nazione = [dict objectForKey:@"Nazione"];
        c.telefono = [dict objectForKey:@"Telefono"];

        
        [trasportoTMP addObject:c];
    }
    
    self.trasporti = [trasportoTMP copy];
    
    
    for (int i=0; i<trasporti.count; i++) {
        Trasporto *trasporto = [[Trasporto alloc] init];
        Trasporto *trasportodb = [[Trasporto alloc] init];
        trasporto = trasporti[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        trasportodb = [db getTrasportoxCodice:trasporto.codtra];
        
        if (trasportodb.id==0){
            [db insertTrasporto:trasporto];
            nuovi++;
        } else {
            trasporto.id = trasportodb.id;
            [db updateTrasporto:trasporto];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync trasporto...");
    
//    messaggio = [messaggio stringByAppendingString:@"Fine sincronismo condizioni di trasporto: "];
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoBanche:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"banche"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *bancheTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Banca *c = [[Banca alloc] init];
        c.codban = [dict objectForKey:@"Codban"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.indirizzo = [dict objectForKey:@"Indirizzo"];
        c.cap = [dict objectForKey:@"Cap"];
        c.citta = [dict objectForKey:@"Citta"];
        c.provincia = [dict objectForKey:@"Provincia"];
        c.nazione = [dict objectForKey:@"Nazione"];
        c.telefono = [dict objectForKey:@"Telefono"];
        c.abi = [dict objectForKey:@"Abi"];
        c.cab = [dict objectForKey:@"Cab"];
        c.iban = [dict objectForKey:@"Iban"];
        c.note = [dict objectForKey:@"Note"];
        
        [bancheTMP addObject:c];
    }
    
    self.banche = [bancheTMP copy];
    
    
    for (int i=0; i<banche.count; i++) {
        Banca *banca = [[Banca alloc] init];
        Banca *bancadb = [[Banca alloc] init];
        banca = banche[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        bancadb = [db getBancaxCodice:banca.codban];
        
        if (bancadb.id==0){
            [db insertBanca:banca];
            nuovi++;
        } else {
            banca.id = bancadb.id;
            [db updateBanca:banca];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync banche...");
    
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    testoMessaggi.text = messaggio;
    
}


- (void) sincronizzoTipiMov:(NSError *)errore
{
    
    NSDictionary* jsonTotale = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&errore];
    NSArray* json = [jsonTotale objectForKey:@"tipimov"];
    
    messaggio = [NSString stringWithFormat:@"%@ %lu righe... ", messaggio, (unsigned long)[json count]];
    testoMessaggi.text = messaggio;
    int nuovi = 0, modificati = 0;
    
    NSMutableArray *tipimovTMP = [[NSMutableArray alloc] initWithCapacity:[json count]];
    for (NSDictionary *dict in json) {
        Tipimov *c = [[Tipimov alloc] init];
        c.codmov = [dict objectForKey:@"Codmov"];
        c.descrizione = [dict objectForKey:@"Descrizione"];
        c.tipo = [[dict objectForKey:@"Tipo"] intValue];
        c.movimentagiacenza = [[dict objectForKey:@"Movimentagiacenza"] intValue];
        c.controparte = [[dict objectForKey:@"Controparte"] intValue];
        
        [tipimovTMP addObject:c];
    }
    
    self.tipimov = [tipimovTMP copy];
    
    
    for (int i=0; i<tipimov.count; i++) {
        Tipimov *tipomov = [[Tipimov alloc] init];
        Tipimov *tipomovdb = [[Tipimov alloc] init];
        tipomov = tipimov[i];
        
        FMDBDataAccess *db = [[FMDBDataAccess alloc] init];
        
        tipomovdb = [db getTipiMovxCodice:tipomov.codmov];
        
        if (tipomovdb.id==0){
            [db insertTipiMov:tipomov];
            nuovi++;
        } else {
            tipomov.id = tipomovdb.id;
            [db updateTipiMov:tipomov];
            modificati++;
        }
        
    }
    NSLog(@"Fine sync tipi movimento...");
    [activityIndicator stopAnimating];
    
    messaggio = [NSString stringWithFormat:@"%@ %i Nuovi %i Aggiornati\r\n", messaggio, nuovi, modificati];
    
    NSString* fine = [NSString stringWithFormat:@"\r\nFine %@ \r\n", [[NSDate date] descriptionWithLocale: [NSLocale currentLocale ]] ];
    messaggio = [messaggio stringByAppendingString:fine];
    testoMessaggi.text = messaggio;
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    [formatter setLocale:[NSLocale currentLocale]];
    
    [defaults setObject:[NSString stringWithFormat:@"%@", [formatter stringFromDate:[NSDate date] ] ] forKey:@"lastsync"];
    [defaults synchronize];
    btnSyncronizza.enabled=YES;
    
}



- (IBAction)btnSyncronizza:(id)sender {
    
    utente = tfUtente.text;
    password = tfPassword.text;
    
    status = 0;
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:utente forKey:@"utente"];
    [defaults setObject:password forKey:@"password"];
    [defaults synchronize];

    messaggio = @"";
    btnSyncronizza.enabled=NO;
    [activityIndicator startAnimating];
    
    NSString* tipoAggionamento = @"";
    if (swiAggiornamentiOTutti.isOn){
        tipoAggionamento = @"Aggiornamento di tutti i records\r\n";
    } else {
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"dd-MM-YYYY HH:mm:ss"];
        [formatter setLocale:[NSLocale currentLocale]];

        tipoAggionamento = [NSString stringWithFormat:@"Aggiornamento delle modifiche dal  %@ \r\n", [formatter stringFromDate:[NSDate date] ] ];
    }
    
    messaggio = [messaggio stringByAppendingString:tipoAggionamento];
    
    NSString* inizio = [NSString stringWithFormat:@"\r\nInizio %@ \r\n", [[NSDate date] descriptionWithLocale: [NSLocale currentLocale ]] ];
    messaggio = [messaggio stringByAppendingString:inizio];
    
    [self syncAll:1];
    
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
